package model

// Order 订单交易
type Order struct {
    OrderId string `gorm:"primaryKey"` //交易编号
    Uid     string `gorm:"index"`      //用户编号

    //订单交易信息
    Status     OrderStatus //待支付、已支付、已完成、已取消、已退款
    TxnDate    string     `gorm:"index"` //交易日期 t8
    TxnAmt     uint64     //订单金额、支付金额(分)
    Amount     int64      //Stripe支付金额(美分)
    Currency   string     `gorm:"default:CNY"` //货币类型：CNY、USD等
	PayType    PayType    //支付类型
	PayMchid   string     //支付商户号/Stripe账户ID
	PayNo      string     //支付平台交易号/Stripe支付会话ID
	PayTime    string     //支付完成时间，根据支付结果通知获取
	PayTimeout string     //支付超时时间 t14
	RefundTime string     //退款时间 t14
	CancelTime string     //取消时间t14
	FinishTime string     //完成时间t14

	//订单产品信息，订单如果有多个产品取第一个
	ProdId    string      //
	ProdName  string      //名称
	ProdNum   uint64      //数量
	ProdPrice uint64      //价格
	ProdType  ProductType //产品类型：会员卡
	ProdThumb string      //产品图片

	Domain  string //下单网站域名
	Ip      string //下单用户IP
	Message string //订单留言，用户填写的内容
	Remark  string //订单备注，商家填写的内容
	Ctime   string `gorm:"index"` //
	Mtime   string //
}

func (Order) TableName() string {
	return "order"
}

// OrderStatus 交易状态
type OrderStatus string

const (
    ORDER_STATUS_PENDING OrderStatus = "pending" // 待支付
    ORDER_STATUS_PAID    OrderStatus = "paid"    // 已支付
    ORDER_STATUS_REFUND  OrderStatus = "refund"  // 已退款
    ORDER_STATUS_CANCEL  OrderStatus = "cancel"  // 已取消
    ORDER_STATUS_FINISH  OrderStatus = "finish"  // 已完成
)

var OrderStatusLabel = map[OrderStatus]string{
    ORDER_STATUS_PENDING: "待支付",
    ORDER_STATUS_PAID:    "已支付",
    ORDER_STATUS_REFUND:  "已退款",
    ORDER_STATUS_CANCEL:  "已取消",
    ORDER_STATUS_FINISH:  "已完成",
}

// PayType 支付方式
type PayType string

const (
	// 微信支付
	PayType_WX_JSAPI  PayType = "wx_jsapi"  // 微信JSAPI支付
	PayType_WX_NATIVE PayType = "wx_native" // 微信扫码支付
	
	// Stripe支付
	PayType_STRIPE_CARD PayType = "stripe_card" // Stripe卡支付
)

var PayTypeLabel = map[PayType]string{
    PayType_WX_JSAPI:    "微信支付",
    PayType_WX_NATIVE:   "微信扫码",
    PayType_STRIPE_CARD: "信用卡",
}

// 删除这两个方法，因为已经有了 Amount 字段
// func (o *Order) Amount() uint64 {
//     return o.TxnAmt
// }
// func (o *Order) SetAmount(amount uint64) {
//     o.TxnAmt = amount
// }
